/********************************************************************************************
********************************************************************************************
    Generate  写寄存器 
    Generate  读寄存器 
********************************************************************************************
********************************************************************************************/
#include "debug.h"
#include "../DDIC/AllDDIC.h"
#include "usbd_cdc_core.h"
//-------------------------------------------------------------------------
#define LP_Gerneric_Short_Write 0x0300 // 0x0302) //Generic mode, LP mode   
#define LP_Gerneric_Long_Write 0x0700
#define LP_DCS_Short_Write 0x0340	   //DCS mode 0342   
#define LP_DCS_Long_Write 0x0740

#define HS_Gerneric_Short_Write 0x031B
#define HS_Gerneric_Long_Write 0x071B	//Generic mode, HS video mode030b
//#define HS_DCS_Short_Write     0x034B	   
#define HS_DCS_Long_Write      0x075B

//-------------------------------------------------
void ssdWrite_Register_LP(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{

	SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
	delay_ms(150);
	//---------------------
	InitCode_count = 0;
   
	for (i = 3; i < 4096; i += (Code_length+1))
	{
		Code_length = buffer[i];	//每一句初始化代码的 数据长度

		if (Code_length == 0xff)	//判断长度有255说明 ，到初始化代码的最后
		{
				break;
		}
		Timing_and_InitCode[0] =	Code_length;	//数组中的[0]：这一句记录首个代码的数据长度	
		
		for (j = 1; j < Code_length+1; j++)	//递增将 初始化代码写入到数组
		{											
				Timing_and_InitCode[j] = ((uint32_t)buffer[i+j]);
		}									
		for(j=0;j<Timing_and_InitCode[0]+1;j++)			//整合一行初始化全部内容									
			InitCode_valid[InitCode_count][j] = (u8)Timing_and_InitCode[j];
		
		InitCode_count ++;	//即将写下一个数组(下一句初始化代码)
	}
	
	Driver_ic_initial_on(OLED.SigMode,1);
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
	delay_ms(5);
	buffer[1] = 0x5a;
	buffer[2] = LP_B7_Data>>8;
	buffer[3] = LP_B7_Data;
	//STM2PC_ERROR(pdev,CDC_IN_EP,buffer[0],Uart_rx_flag,Uart_Error_None,0);
	STM2PC_RM671xx(pdev,CDC_IN_EP,buffer,4);           //返回 写寄存器状态  ：ok                      
}
void ssdWrite_Register_HS(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	InitCode_count = 0;
	for (i = 3; i < 4096; i += (Code_length+1))
	{
		Code_length = buffer[i];	//每一句初始化代码的 数据长度

		if (Code_length == 0xff)	//判断长度有255说明 ，到初始化代码的最后
		{
				break;
		}
		Timing_and_InitCode[0] =	Code_length;	//数组中的[0]：这一句记录首个代码的数据长度	
		
		for (j = 1; j < Code_length+1; j++)	//递增将 初始化代码写入到数组
		{											
				Timing_and_InitCode[j] = ((uint32_t)buffer[i+j]);
		}									
		for(j=0;j<Timing_and_InitCode[0]+1;j++)			//整合一行初始化全部内容									
			InitCode_valid[InitCode_count][j] = (u8)Timing_and_InitCode[j];
		
		InitCode_count ++;	//即将写下一个数组(下一句初始化代码)
	}
	
	Driver_ic_initial_on(OLED.SigMode,1);
    	
	delay_ms(50);

	buffer[1] = 0x5a;
	buffer[2] = LP_B7_Data>>8;
	buffer[3] = LP_B7_Data;
	STM2PC_RM671xx(pdev,CDC_IN_EP,buffer,4);           //返回 写寄存器状态  ：ok                      
}


void HFZGenerate_Write_Function (USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8 buffer[],u16 LP_B7_Data,u16 HS_B7_Data)
{	
	//void *pdev;  RM692Ax_Gamma_OTP_Start(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
	switch((buffer[1]&0xF0)>>4)
	{	//判断D7，1：读，0：写
		
		case 0x0:  //LP写寄存器
		case 0x1:  //写寄存器
		case 0x2:  //写寄存器
		case 0x3:  //写寄存器
			ssdWrite_Register_LP(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
			break;	
		case 0x4:  //HS 写寄存器
		case 0x5:  //写寄存器
		case 0x6:  //写寄存器
		case 0x7:  //写寄存器
			ssdWrite_Register_HS(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
			break;		
		
		default:break;
	}			
}


